
package com.hlkj.pay.app.merchant.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.hlkj.framework.common.pojo.CommonResult;
import com.hlkj.framework.common.util.collection.CollectionUtils;
import com.hlkj.framework.common.util.id.IdUtils;
import com.hlkj.framework.common.util.json.JsonUtils;
import com.hlkj.framework.extension.executor.ExtensionExecutor;
import com.hlkj.framework.extension.scenario.BizScenario;
import com.hlkj.pay.app.merchant.IMerchantInfoApplicationAppService;
import com.hlkj.pay.app.merchant.ext.ChannelMerchantAccessExtPt;
import com.hlkj.pay.app.merchant.ext.MerchantExtConstant;
import com.hlkj.pay.app.merchant.ext.SystemMerchantAccessStatusExtPt;
import com.hlkj.pay.app.merchant.ext.dto.access.SystemMerchantAccessStatusContext;
import com.hlkj.pay.common.constants.MqConstant;
import com.hlkj.pay.config.ExtRocketMQTemplate;
import com.hlkj.pay.dto.merchant.AccessChannelParamsDto;
import com.hlkj.pay.dto.merchant.MerchantAccessDto;
import com.hlkj.pay.dto.merchant.MerchantAccessSignLink;
import com.hlkj.pay.dto.merchant.MerchantWechatConfigListDto;
import com.hlkj.pay.dto.merchant.access.MerchantAccessResDto;
import com.hlkj.pay.enums.MerchantEnum;
import com.hlkj.pay.enums.PayEnums;
import com.hlkj.pay.gateway.merchant.IMerchantAccessGateway;
import com.hlkj.pay.infrastructure.model.merchant.MerchantAccessAuthDO;
import com.hlkj.pay.infrastructure.model.merchant.MerchantAccessInfoDO;
import com.hlkj.pay.infrastructure.model.pay.ProviderChannelConfigDO;
import com.hlkj.pay.service.common.IOperatedLogService;
import com.hlkj.pay.service.merchant.IMerchantAccessAuthService;
import com.hlkj.pay.service.merchant.IMerchantAccessService;
import com.hlkj.pay.service.pay.IProviderService;

import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * @author HlpayTeam
 * @date 2024/09/25 13:09
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class MerchantAccessChannelService {

    private final IMerchantAccessService merchantAccessService;

    private final IOperatedLogService merchantAccessLogService;

    private final IMerchantInfoApplicationAppService merchantInfoApplicationAppService;

    private final IMerchantAccessAuthService merchantAccessAuthService;

    private final ExtensionExecutor extensionExecutor;

    private final ExtRocketMQTemplate extRocketMQTemplate;

    private final IProviderService providerService;


    @Value("${hlkj.pay.test:false}")
    private boolean payTest;

    private final IMerchantAccessGateway merchantAccessGateway;

    public boolean extensionExist(String channelCode) {
        return merchantAccessGateway.extensionExist(channelCode);
    }

    /**
     * 进件
     *
     * @param merchantAccessDto
     */
    public boolean processApply(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (merchantAccessInfoDO == null) {
            log.warn("processAccessMessage 数据不存在 id:{}", merchantAccessInfoDO.getId());
            return false;
        }
        Long id = merchantAccessInfoDO.getId();
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.merchantAccess(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(id);
        List<MerchantAccessSignLink> signLinks = null;
        MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
        if (merchantAccessResDto != null) {
            Integer accessStatus = merchantAccessResDto.getAccessStatus().getCode();
            if (merchantAccessInfoDO.getLastStatus() > accessStatus) {
                // 更新完信息后回到上一个状态
                accessStatus = merchantAccessInfoDO.getLastStatus();
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            if (StringUtils.hasText(merchantAccessResDto.getRequestId())) {
                updateMerchantAccessInfoDO.setRequestId(merchantAccessResDto.getRequestId());
            }
            updateMerchantAccessInfoDO.setStatus(accessStatus);
            if (StringUtils.hasText(merchantAccessResDto.getRemark()))
                updateMerchantAccessInfoDO.setRemark(merchantAccessResDto.getRemark());
            else
                updateMerchantAccessInfoDO.setRemark("");
            updateMerchantAccessInfoDO.setApplyNo(merchantAccessResDto.getApplyNo());
            updateMerchantAccessInfoDO.setSubMchId(merchantAccessResDto.getSubMchId());
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            signLinks = accessResDtoCommonResult.getData().getSignLinks();
            //2：已提交，等待平台审核，3：系统自动审核中，4：系统审核通过渠道审核中，5：平台审核中，6：待签约，7：签约中，8：待配置，9：配置中，10：审核完成，11：审核驳回
            String msg = "";
            if (accessStatus == 5) msg = "平台审核中";
            if (accessStatus == 6) msg = "待签约";
            if (accessStatus == 7) msg = "签约中";
            if (accessStatus == 8) msg = "待配置";
            if (accessStatus == 9) msg = "配置中";
            if (accessStatus == 10) msg = "审核完成";
            merchantAccessLogService.save(id, MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "机构审核", msg);
        } else {
            if (StringUtils.hasText(merchantAccessDto.getMerchantAccessInfo().getSubMchId())) {
                updateMerchantAccessInfoDO.setSubMchId(merchantAccessDto.getMerchantAccessInfo().getSubMchId());
            }

            if (StringUtils.hasText(merchantAccessDto.getMerchantAccessInfo().getApplyNo())) {
                updateMerchantAccessInfoDO.setApplyNo(merchantAccessDto.getMerchantAccessInfo().getApplyNo());
            }
        }
        if (!accessResDtoCommonResult.isSuccess()) {
            updateMerchantAccessInfoDO.setStatus(MerchantEnum.ACCESS_STATUS.APPROVE_REFUSE.getCode());
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
            merchantAccessLogService.save(id, MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "机构驳回", accessResDtoCommonResult.getMsg());
        }
        updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, signLinks);
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 文件签署
     *
     * @param merchantAccessDto
     */
    public boolean processSign(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.processSign(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        List<MerchantAccessSignLink> signLinks = null;
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
            updateMerchantAccessInfoDO.setRemark("");
            updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, merchantAccessResDto.getSignLinks());
            // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
            signLinks = accessResDtoCommonResult.getData().getSignLinks();
            merchantAccessLogService.save(merchantAccessInfoDO.getId(), MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "平台签约", "签约中");
        }
        else {
            updateMerchantAccessInfoDO.setStatus(MerchantEnum.ACCESS_STATUS.APPROVE_REFUSE.getCode());
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
            merchantAccessLogService.save(merchantAccessInfoDO.getId(), MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "平台签约", "签约失败：" + accessResDtoCommonResult.getMsg());
        }
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, signLinks);
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 文件签署
     *
     * @param merchantAccessDto
     */
    public boolean processSignQuery(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.processSignQuery(merchantAccessDto);
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto.getAccessStatus() != null) {
                // MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
                // updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
                // updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
                // updateMerchantAccessInfoDO.setRemark("");
                // updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
                // merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
                MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
                updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
                updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
                if (merchantAccessResDto.getAuditStatus() != null) {
                    updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
                }
                updateMerchantAccessInfoDO.setRemark("");
                updateMerchantAccessInfoDO.setSubMchId(merchantAccessResDto.getSubMchId());
                if (StringUtils.hasText(merchantAccessInfoDO.getExtendA())) {
                    // 此处 兼容易生支付，签名后返回子商户信息，此处做保存处理 0205
                    updateMerchantAccessInfoDO.setExtendA(merchantAccessInfoDO.getExtendA());
                }

                updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
                merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
            }
            if(CollUtil.isNotEmpty(merchantAccessResDto.getSignLinks())){
                merchantAccessService.updateSignlinks(merchantAccessInfoDO.getId(), merchantAccessResDto.getSignLinks());
            }
            // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        }
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 业务参数配置
     *
     * @param merchantAccessDto
     */
    public boolean businessConfig(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.merchantBusinessOpen(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        List<MerchantAccessSignLink> signLinks = null;
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto.getAccessStatus() != null) {
                updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
                if (StringUtils.hasText(merchantAccessResDto.getRemark())) {
                    updateMerchantAccessInfoDO.setRemark(merchantAccessResDto.getRemark());
                }
                else {
                    updateMerchantAccessInfoDO.setRemark("");
                }
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getSubMchId())) {
                updateMerchantAccessInfoDO.setSubMchId(merchantAccessResDto.getSubMchId());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            updateMerchantAccessInfoDO.setRemark("");
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (merchantAccessResDto.getLastAccessStatus() != null) {
                updateMerchantAccessInfoDO.setLastStatus(merchantAccessResDto.getLastAccessStatus().getCode());
            }
            // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
            if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
                merchantAccessResDto.getMerchantAccessAuths().stream().forEach(merchantAccessAuthDO -> {
                    merchantAccessAuthDO.setAccessId(merchantAccessInfoDO.getId());
                    merchantAccessAuthDO.setSn(merchantAccessInfoDO.getSn());
                });
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
                merchantAccessLogService.save(merchantAccessInfoDO.getId(), MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "商户初始化配置", "新增AUT配置");
            }
            signLinks = accessResDtoCommonResult.getData().getSignLinks();
        }
        else {
            updateMerchantAccessInfoDO.setStatus(MerchantEnum.ACCESS_STATUS.APPROVE_REFUSE.getCode());
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
            merchantAccessLogService.save(merchantAccessInfoDO.getId(), MerchantEnum.MERCHANT_LOG_TYPE.ACCESS, "商户初始化失败", accessResDtoCommonResult.getMsg());
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto != null) {
                if (merchantAccessResDto.getLastAccessStatus() != null) {
                    updateMerchantAccessInfoDO.setLastStatus(merchantAccessResDto.getLastAccessStatus().getCode());
                }
            }
        }
        if (updateMerchantAccessInfoDO.getLastStatus() == null) {
            updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
        }
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, signLinks);
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 微信参数配置
     *
     * @param merchantAccessDto
     */
    public boolean wechatConfig(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
        if (authConfigQueryType) {
            List<MerchantAccessAuthDO> merchantAccessAuthList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.WECHAT);
            merchantAccessDto.setMerchantAccessAuthList(merchantAccessAuthList);
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.wechatConfigInit(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
        if (merchantAccessResDto.getAccessStatus() != null) {
            updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
        }
        if (merchantAccessResDto.getAuditStatus() != null) {
            updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
        }
        if (accessResDtoCommonResult.isSuccess()) {
            updateMerchantAccessInfoDO.setRemark("");
        }
        else {
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
            updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
        }
        if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
            updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
        }
        if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
            merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
        }
        updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        // if (accessResDtoCommonResult.isSuccess()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 微信参数配置查询
     *
     * @param merchantAccessDto
     * @param system
     * @return
     */
    public MerchantWechatConfigListDto wechatConfigQuery(MerchantAccessDto merchantAccessDto, boolean system, List<MerchantAccessAuthDO> wechatAccessAuthDbList) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (CollectionUtils.isEmpty(wechatAccessAuthDbList)) {
            boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
            if (authConfigQueryType) {
                wechatAccessAuthDbList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.WECHAT);
            }
        }
        CommonResult<MerchantAccessResDto> wechatConfigListDtoCommonResult = merchantAccessGateway.wechatConfigQuery(merchantAccessDto, wechatAccessAuthDbList);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        MerchantWechatConfigListDto merchantWechatConfigListDto = null;
        if (wechatConfigListDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = wechatConfigListDtoCommonResult.getData();
            merchantWechatConfigListDto = merchantAccessResDto.getMerchantWechatConfigListDto();
            if (!system) {
                return merchantWechatConfigListDto;
            }
            updateMerchantAccessInfoDO.setRemark("");
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
        }
        else {
            updateMerchantAccessInfoDO.setRemark(wechatConfigListDtoCommonResult.getMsg());
        }
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        // if (wechatConfigListDtoCommonResult.isSuccess()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return merchantWechatConfigListDto;
    }

    /**
     * 微信认证
     *
     * @param merchantAccessDto
     */
    public boolean wechatAuthConfig(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
        if (authConfigQueryType) {
            List<MerchantAccessAuthDO> merchantAccessAuthList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.WECHAT);
            merchantAccessDto.setMerchantAccessAuthList(merchantAccessAuthList);
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.wechatAuthConfig(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto.getAccessStatus() != null) {
                updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
            }
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
            }
        }
        else {
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        // if (accessResDtoCommonResult.isSuccess()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 微信认证查询
     *
     * @param merchantAccessDto
     * @param system
     * @return
     */
    public List<MerchantAccessAuthDO> wechatAuthConfigQuery(MerchantAccessDto merchantAccessDto, boolean system, List<MerchantAccessAuthDO> wechatAccessAuthDbList) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (CollectionUtils.isEmpty(wechatAccessAuthDbList)) {
            boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
            if (authConfigQueryType) {
                wechatAccessAuthDbList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.WECHAT);
            }
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.wechatAuthConfigQuery(merchantAccessDto, wechatAccessAuthDbList);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        List<MerchantAccessAuthDO> merchantAccessAuthList = null;
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            merchantAccessAuthList = merchantAccessResDto.getMerchantAccessAuths();
            if (!system) {
                return merchantAccessAuthList;
            }
            updateMerchantAccessInfoDO.setRemark("");
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessAuthList)) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessAuthList);
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        }
        else {
            // updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        return merchantAccessAuthList;
    }

    public List<MerchantAccessAuthDO> wechatAuthConfigQuery(MerchantAccessDto merchantAccessDto, boolean system, List<MerchantAccessAuthDO> wechatAccessAuthDbList, boolean page) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (CollectionUtils.isEmpty(wechatAccessAuthDbList) && !page) {
            boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
            if (authConfigQueryType) {
                wechatAccessAuthDbList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.WECHAT);
            }
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.wechatAuthConfigQuery(merchantAccessDto, wechatAccessAuthDbList);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        List<MerchantAccessAuthDO> merchantAccessAuthList = null;
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            merchantAccessAuthList = merchantAccessResDto.getMerchantAccessAuths();
            if (!system) {
                return merchantAccessAuthList;
            }
            updateMerchantAccessInfoDO.setRemark("");
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessAuthList)) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessAuthList);
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        }
        else {
            // updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        // if (accessResDtoCommonResult.isSuccess()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return merchantAccessAuthList;
    }

    /**
     * 支付宝认证
     *
     * @param merchantAccessDto
     */
    public boolean aliAuthConfig(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
        if (authConfigQueryType) {
            List<MerchantAccessAuthDO> merchantAccessAuthList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.ALIPAY);
            merchantAccessDto.setMerchantAccessAuthList(merchantAccessAuthList);
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.aliAuthConfig(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto.getAccessStatus() != null) {
                updateMerchantAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
            }
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
            }
        }
        else {
            updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        updateMerchantAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
        merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        // if (accessResDtoCommonResult.isSuccess()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return accessResDtoCommonResult.isSuccess();
    }

    /**
     * 支付宝认证查询
     *
     * @param merchantAccessDto
     * @param system
     * @return
     */
    public List<MerchantAccessAuthDO> aliAuthConfigQuery(MerchantAccessDto merchantAccessDto, boolean system, List<MerchantAccessAuthDO> aliAccessAuthDbList) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (CollectionUtils.isEmpty(aliAccessAuthDbList)) {
            boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
            if (authConfigQueryType) {
                aliAccessAuthDbList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.ALIPAY);
            }
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.aliAuthConfigQuery(merchantAccessDto, aliAccessAuthDbList);
        List<MerchantAccessAuthDO> merchantAccessAuths = null;
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            merchantAccessAuths = merchantAccessResDto.getMerchantAccessAuths();
            if (!system) {
                return merchantAccessAuths;
            }
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessAuths)) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessAuths);
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        }
        else {
            // updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        return merchantAccessAuths;
    }

    public List<MerchantAccessAuthDO> aliAuthConfigQuery(MerchantAccessDto merchantAccessDto, boolean system, List<MerchantAccessAuthDO> aliAccessAuthDbList, boolean page) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        if (CollectionUtils.isEmpty(aliAccessAuthDbList) && !page) {
            boolean authConfigQueryType = merchantAccessGateway.authConfigQueryType(merchantAccessInfoDO.getChannelCode());
            if (authConfigQueryType) {
                aliAccessAuthDbList = merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId(), PayEnums.PAY_TYPE.ALIPAY);
            }
        }
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.aliAuthConfigQuery(merchantAccessDto, aliAccessAuthDbList);
        List<MerchantAccessAuthDO> merchantAccessAuths = null;
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            merchantAccessAuths = merchantAccessResDto.getMerchantAccessAuths();
            if (!system) {
                return merchantAccessAuths;
            }
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateMerchantAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (CollectionUtils.isNotEmpty(merchantAccessAuths)) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessAuths);
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateMerchantAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateMerchantAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        }
        else {
            // updateMerchantAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
        }
        return merchantAccessAuths;
    }

    /**
     * 进件查询
     *
     * @param merchantAccessDto
     */
    public boolean applyQuery(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        merchantAccessDto.setMerchantAccessAuthList(merchantAccessAuthService.queryMerchantAccessAuth(merchantAccessInfoDO.getId()));
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.merchantAccessQuery(merchantAccessDto);
        MerchantAccessInfoDO updateAccessInfoDO = new MerchantAccessInfoDO();
        updateAccessInfoDO.setId(merchantAccessInfoDO.getId());
        // 签约链接
        List<MerchantAccessSignLink> signLinks = null;
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (merchantAccessResDto.getAccessStatus() != null) {
                updateAccessInfoDO.setStatus(merchantAccessResDto.getAccessStatus().getCode());
                updateAccessInfoDO.setLastStatus(merchantAccessInfoDO.getStatus());
            }
            if (merchantAccessResDto.getAuditStatus() != null) {
                updateAccessInfoDO.setAuditStatus(merchantAccessResDto.getAuditStatus().getCode());
            }
            if (StringUtils.hasText(merchantAccessResDto.getRemark())) {
                updateAccessInfoDO.setRemark(merchantAccessResDto.getRemark());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendA())) {
                updateAccessInfoDO.setExtendA(merchantAccessResDto.getExtendA());
            }
            if (StringUtils.hasText(merchantAccessResDto.getExtendB())) {
                updateAccessInfoDO.setExtendB(merchantAccessResDto.getExtendB());
            }
            if (StringUtils.hasText(merchantAccessResDto.getSubMchId())) {
                updateAccessInfoDO.setSubMchId(merchantAccessResDto.getSubMchId());
            }
            if(CollUtil.isNotEmpty(merchantAccessResDto.getSignLinks())){
                signLinks = merchantAccessResDto.getSignLinks();
            }
            if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
            }
        }
        else {
            updateAccessInfoDO.setRemark(accessResDtoCommonResult.getMsg());
            updateAccessInfoDO.setStatus(MerchantEnum.ACCESS_STATUS.APPROVE_REFUSE.getCode());
        }
        merchantAccessService.updateAccessInfo(updateAccessInfoDO, signLinks);
        return accessResDtoCommonResult.isSuccess();
    }

    public void syncChannel(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        ProviderChannelConfigDO providerChannelConfigDO = providerService.queryConfig(merchantAccessInfoDO.getProviderCode(), merchantAccessInfoDO.getChannelCode());
        // 获取通道参数
        AccessChannelParamsDto accessChannelParamsDto = new AccessChannelParamsDto();
        accessChannelParamsDto.setSubMchId(merchantAccessInfoDO.getSubMchId());
        accessChannelParamsDto.setExtendA(merchantAccessInfoDO.getExtendA());
        accessChannelParamsDto.setExtendB(merchantAccessInfoDO.getExtendB());
        accessChannelParamsDto.setProviderChannelConfigDO(providerChannelConfigDO);

        String mchChannelCode = null;
        // 直付通默认绑定商户
        if(merchantAccessInfoDO.getChannelCode().equals(MerchantExtConstant.CHANNEL_ALI_PAY_ZFT)){
            mchChannelCode = IdUtils.getSnowflake().nextIdStr();
        }
        String channelParams = extensionExecutor.execute(ChannelMerchantAccessExtPt.class, BizScenario.valueOf(merchantAccessInfoDO.getChannelCode()),
                ex -> ex.channelParams(accessChannelParamsDto));
        merchantInfoApplicationAppService.addAppChannelInfo(merchantAccessInfoDO, channelParams, mchChannelCode,MerchantEnum.DATA_RELATION_TYPE.ACCESS);

        accessChannelParamsDto.setMchChannelCode(mchChannelCode);
        // 绑定分账默认通道
        extensionExecutor.execute(ChannelMerchantAccessExtPt.class, BizScenario.valueOf(merchantAccessInfoDO.getChannelCode()),
                ex -> ex.channelParams(accessChannelParamsDto));
    }

    /**
     * 系统认证
     *
     * @param merchantAccessDto
     */
    public boolean systemAuth(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        SystemMerchantAccessStatusContext systemMerchantAccessStatusContext = new SystemMerchantAccessStatusContext();
        systemMerchantAccessStatusContext.setMerchantAccessDto(merchantAccessDto);
        systemMerchantAccessStatusContext.setTest(payTest);
        try {
            extensionExecutor.executeVoid(SystemMerchantAccessStatusExtPt.class, BizScenario.valueOf(merchantAccessInfoDO.getStatus().toString()),
                    ex -> ex.merchantAccessStatusProcess(systemMerchantAccessStatusContext));
            MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
            updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
            updateMerchantAccessInfoDO.setStatus(systemMerchantAccessStatusContext.getAccessStatus().getCode());
            updateMerchantAccessInfoDO.setRemark(systemMerchantAccessStatusContext.getRemark());
            merchantAccessService.updateAccessInfo(updateMerchantAccessInfoDO, null);
        }
        catch (Exception e) {
            extensionExecutor.executeVoid(SystemMerchantAccessStatusExtPt.class, BizScenario.valueOf(MerchantExtConstant.ACCESS_STATUS_SYSTEM_AUTH),
                    ex -> ex.merchantAccessStatusProcess(systemMerchantAccessStatusContext));
        }
        // if (systemMerchantAccessStatusContext.isProcessStatus()) {
        // sendMerchantAccessMessage(merchantAccessInfoDO.getId());
        // }
        return systemMerchantAccessStatusContext.isProcessStatus();
    }

    public void reloadMerchantAuth(MerchantAccessDto merchantAccessDto) {
        MerchantAccessInfoDO merchantAccessInfoDO = merchantAccessDto.getMerchantAccessInfo();
        CommonResult<MerchantAccessResDto> accessResDtoCommonResult = merchantAccessGateway.reloadMerchantAuth(merchantAccessDto);
        MerchantAccessInfoDO updateMerchantAccessInfoDO = new MerchantAccessInfoDO();
        updateMerchantAccessInfoDO.setId(merchantAccessInfoDO.getId());
        if (accessResDtoCommonResult.isSuccess()) {
            MerchantAccessResDto merchantAccessResDto = accessResDtoCommonResult.getData();
            if (CollectionUtils.isNotEmpty(merchantAccessResDto.getMerchantAccessAuths())) {
                merchantAccessResDto.getMerchantAccessAuths().stream().forEach(merchantAccessAuthDO -> {
                    merchantAccessAuthDO.setAccessId(merchantAccessInfoDO.getId());
                    merchantAccessAuthDO.setSn(merchantAccessInfoDO.getSn());
                });
                merchantAccessAuthService.saveMerchantAccessAuth(merchantAccessResDto.getMerchantAccessAuths());
            }
        }
    }

    public void sendMerchantAccessMessage(Long id) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        String jsonString = JsonUtils.toJsonString(map);
        log.info("sendMerchantAccessMessage:{}", jsonString);
        extRocketMQTemplate.send(MqConstant.MERCHANT_ACCESS_STATUS_TOPIC, jsonString);
    }

}
